#include<iostream>
using namespace std;
const int N=1e6+10;
int f[N];
int n,m;
int r[N];
int d[N],s[N],t[N];
bool check(int mid)
{
	//构建差分数组
	for(int i=1;i<=n;i++) f[i]=r[i]-r[i-1];
	for(int i=1;i<=mid;i++)
	{
		int l=s[i];int r=t[i];
		f[l]-=d[i];f[r+1]+=d[i];
	}
	
	//还原差分数组
	for(int i=1;i<=n;i++)
	{
		f[i]=f[i-1]+f[i];
		if(f[i]<0) return false;
	 } 
	 return true;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>r[i];
	}
	for(int i=1;i<=m;i++)
	{
		cin>>d[i]>>s[i]>>t[i];
	}
	//这个题和之前的题很像
	//结论：如果遇到更改一次就要检测一次的差分题，就看看能不能用二分答案加差分
	//因为每次检测还原差分数组都是n，那这样的话就是n2了，我们用二分答案可以降低还原差分的次数
	//l,r是订单次数 
	int l=1;int r=m;	
	while(l<r)
	{
		int mid=(l+r)/2;
		if(check(mid)) l=mid+1;
		else r=mid;
	}
	 if(check(l)) cout<<0<<endl;
	 else cout<<-1<<endl<<l<<endl;
	
}